/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bl;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.ButtonModel;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.RowFilter;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

/**
 *
 * @author Kien Chinh
 */
public class PagingTable {
    private static final int LR_PAGE_SIZE = 3;
    private JPanel box;
    private TableRowSorter<TableModel> sorter;
    private TableModel model;

    public PagingTable(JPanel box, TableRowSorter<TableModel> sorter, TableModel model) {
        this.box = box;
        this.sorter = sorter;
        this.model = model;
    }
    
    public void initLinkBox(final int itemsPerPage, final int currentPageIndex) {
        //assert currentPageIndex>0;
        sorter.setRowFilter(makeRowFilter(itemsPerPage, currentPageIndex - 1));

        ArrayList<JButton> paginationButtons = new ArrayList<>();

        //Tìm startpage (LR_Page_Size = số lượng được hiển thị) = page hiện tại - tổng page được hiện tính cả (sau lẫn trước)
        int startPageIndex = currentPageIndex - LR_PAGE_SIZE;
        //System.out.println("startPageIndex : "+startPageIndex);
        if (startPageIndex <= 0) {
            startPageIndex = 1;
        }
        //System.out.println("startPageIndex : "+startPageIndex);

        //rowCounut = số lượng list
        int rowCount = model.getRowCount();
        int v = rowCount % itemsPerPage == 0 ? 0 : 1;
        //Tìm ra maxPage với số lượng chia lấy dư với ItemperPage nếu chia hết thì +0 còn dư thì +1
        int maxPageIndex = rowCount / itemsPerPage + v;

        //Trang cuối = page hiện tại + page được hiện - 1
        int endPageIndex = currentPageIndex + LR_PAGE_SIZE - 1;
        if (endPageIndex > maxPageIndex) {
            endPageIndex = maxPageIndex;
        }

        //Page hiện tại > 1 thêm nút Prev
        if (currentPageIndex > 1) {
            paginationButtons.add(makePNButton(itemsPerPage, currentPageIndex - 1, "Prev"));
        }

        //Startpage < endpage thêm nút
        if (startPageIndex < endPageIndex) {
            for (int i = startPageIndex; i <= endPageIndex; i++) {
                paginationButtons.add(makeButton(itemsPerPage, currentPageIndex, i - 1));
            }
        }

        //Tổng page > page hiện tại thêm nút next
        if (currentPageIndex < maxPageIndex) {
            paginationButtons.add(makePNButton(itemsPerPage, currentPageIndex + 1, "Next"));
        }

        box.removeAll();
        ButtonGroup bg = new ButtonGroup();
        box.add(Box.createHorizontalGlue());
        for (JButton r : paginationButtons) {
            box.add(r);
            bg.add(r);
        }
        box.add(Box.createHorizontalGlue());
        box.revalidate();
        box.repaint();
        paginationButtons.clear();
    }

    public JButton makeButton(final int itemsPerPage, final int current, final int target) {
        JButton button = new JButton(String.valueOf(target + 1)) {
            @Override
            protected void fireStateChanged() {
                ButtonModel model = getModel();
                if (!model.isEnabled()) {
                    setForeground(Color.GRAY);
                } else if (model.isPressed() && model.isArmed()) {
                    setForeground(Color.GREEN);
                } else if (model.isSelected()) {
                    setForeground(Color.RED);
                    //}else if(isRolloverEnabled() && model.isRollover()) {
                    //    setForeground(Color.BLUE);
                }
                super.fireStateChanged();
            }
        };
        button.setForeground(Color.BLUE);
        if (target + 1 == current) {
            button.setSelected(true);
        }
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                initLinkBox(itemsPerPage, target + 1);
            }
        });
        return button;
    }

    public JButton makePNButton(final int itemsPerPage, final int target, String title) {
        JButton button = new JButton(title);
        button.setForeground(Color.BLUE);
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                initLinkBox(itemsPerPage, target);
            }
        });
        return button;
    }

    public RowFilter<TableModel, Integer> makeRowFilter(final int itemsPerPage, final int target) {
        return new RowFilter<TableModel, Integer>() {
            @Override
            public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) {
                int ei = entry.getIdentifier();
                return target * itemsPerPage <= ei && ei < target * itemsPerPage + itemsPerPage;
            }
        };
    }
}
